// 循环队列（顺序队列）
#ifndef CIR_QUEUE_H
#define CIR_QUEUE_H

#define MAX_SIZE 100

typedef char ElemType;

// 循环队列结构体
typedef struct
{
	ElemType *base; // 初始空间（实质为一个数组）
	int front;		// 队头索引
	int rear;		// 队尾索引
} CircularQueue;

/**
 * 初始化一个循环队列
 * @param queue 传入队列引用以初始化
 */
void initCircularQueue(CircularQueue &);

/**
 * 循环队列是否为空
 * @param queue 传入队列引用
 * @return 队列是否为空
 */
int circularQueueEmpty(CircularQueue &);

/**
 * 循环队列是否已满
 * @param queue 传入队列引用
 * @return 队列是否已满
 */
int circularQueueFull(CircularQueue &);

/**
 * 返回循环队列长度
 * @param queue 传入队列引用
 * @return 队列的长度
 */
int circularQueueLength(CircularQueue &);

/**
 * 元素入队（从队尾）
 * @param queue 传入队列引用
 * @param e 入队的元素
 */
void enterCircularQueue(CircularQueue &, ElemType);

/**
 * 队头元素出队
 * @param queue 传入队列引用
 * @return 出队的元素
 */
ElemType goOutCircularQueue(CircularQueue &);

/**
 * 遍历队列中每个元素并传入visit函数调用
 * @param queue 传入队列引用
 * @param visit(ElemType&) 回调函数
 */
void circularQueueTraverse(CircularQueue &, void(ElemType &));

#include "./cir-queue.cpp"

#endif